### 23.6 Registering custom attributes or pragmas

For analysis (or other) purposes it is useful to be able to add custom attributes or pragmas.

The `PLUGIN_ATTRIBUTES` callback is called during attribute registration. Use the `register_attribute` function to register custom attributes.

         /* Attribute handler callback */
         static tree
         handle_user_attribute (tree *node, tree name, tree args,
                                int flags, bool *no_add_attrs)
         {
           return NULL_TREE;
         }

         /* Attribute definition */
         static struct attribute_spec user_attr =
           { "user", 1, 1, false,  false, false, handle_user_attribute, false };

         /* Plugin callback called during attribute registration.
         Registered with register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL)
         */
         static void
         register_attributes (void *event_data, void *data)
         {
           warning (0, G_("Callback to register attributes"));
           register_attribute (&user_attr);
         }

The PLUGIN_PRAGMAS callback is called once during pragmas registration. Use the `c_register_pragma`, `c_register_pragma_with_data`, `c_register_pragma_with_expansion`, `c_register_pragma_with_expansion_and_data` functions to register custom pragmas and their handlers (which often want to call `pragma_lex`) from `c-family/c-pragma.h`.

         /* Plugin callback called during pragmas registration. Registered with
              register_callback (plugin_name, PLUGIN_PRAGMAS,
                                 register_my_pragma, NULL);
         */
         static void
         register_my_pragma (void *event_data, void *data)
         {
           warning (0, G_("Callback to register pragmas"));
           c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
         }

It is suggested to pass `"GCCPLUGIN"` (or a short name identifying your plugin) as the “space” argument of your pragma.

Pragmas registered with `c_register_pragma_with_expansion` or `c_register_pragma_with_expansion_and_data` support preprocessor expansions. For example:

         #define NUMBER 10
         #pragma GCCPLUGIN foothreshold (NUMBER)